﻿#include "pch.h"
#include "MainWindow.h"
#include "Resource.h"

BEGIN_MESSAGE_MAP(MainWindow, CDialog)
    ON_MESSAGE(Const::UM_GAME_OVER, OnGameOver)
    ON_COMMAND_RANGE(IDC_MENU_ITEM_HAS_BORDER, IDC_MENU_ITEM_NO_BORDER, OnMenuItemSetBorderClicked)
    ON_COMMAND_RANGE(IDC_MENU_ITEM_EASY, IDC_MENU_ITEM_HARD, OnMenuItemSetDifficultyClicked)
    ON_COMMAND(IDC_MENU_ITEM_SET_PICTURE, OnMenuItemSetPictureClicked)
    ON_COMMAND(IDC_MENU_ITEM_START, OnMenuItemStartClicked)
    ON_COMMAND_RANGE(IDC_PICTURE_CTRL, IDC_PICTURE_CTRL + Const::MAX_PICTURE_CTRL_COUNT - 1, OnPictureCtrlClicked)
END_MESSAGE_MAP()

/**
 * 构造方法。
 * @param parent    父窗口
 */
MainWindow::MainWindow(CWnd* parent) :
    CDialog(IDD_MAIN_WINDOW, parent),
    mGame(NULL),
    mGameBoard(Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_HEIGHT) {
}

/**
 * 析构方法。
 */
MainWindow::~MainWindow() {
    delete mGame;
}

/**
 * 游戏结束事件的响应方法。
 * @return 总是零
 */
LRESULT MainWindow::OnGameOver(WPARAM, LPARAM) {
    // 显示胜利提示信息
    AfxMessageBox(IDS_WON, MB_ICONINFORMATION);

    return 0;
}

/**
 * 初始化事件的响应方法。
 * @return 总是 TRUE
 */
BOOL MainWindow::OnInitDialog() {
    CDialog::OnInitDialog();

    // 设置菜单项
    CDialog::GetMenu()->CheckMenuRadioItem(IDC_MENU_ITEM_EASY, IDC_MENU_ITEM_HARD, IDC_MENU_ITEM_EASY, MF_CHECKED | MF_BYCOMMAND);
    CDialog::GetMenu()->CheckMenuRadioItem(IDC_MENU_ITEM_HAS_BORDER,
        IDC_MENU_ITEM_NO_BORDER, IDC_MENU_ITEM_HAS_BORDER, MF_CHECKED | MF_BYCOMMAND);

    // 创建游戏区域
    CRect gameBoardRect(0, 0, Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_HEIGHT);
    mGameBoard.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, gameBoardRect, this, 0);

    // 创建游戏
    mGame = new Game(this, mGameBoard.GetDrawer(), &mGameBoard);

    return TRUE;
}

/**
 * "图片边框"菜单项的单击响应方法。
 * @param id    用户单击的菜单项的 id
 */
void MainWindow::OnMenuItemSetBorderClicked(UINT id) {
    // 如果要设置的参数与当前游戏参数相同，则直接返回
    BOOL hasBorder = id == IDC_MENU_ITEM_HAS_BORDER;
    if (hasBorder == mGame->PictureHasBorder()) {
        return;
    }

    // 设置边框
    mGame->SetPictureBorder(hasBorder);

    // 选中菜单项
    CDialog::GetMenu()->CheckMenuRadioItem(IDC_MENU_ITEM_HAS_BORDER, IDC_MENU_ITEM_NO_BORDER, id, MF_BYCOMMAND);
}

/**
 * "难度"菜单项的单击响应方法。
 * @param id    菜单项 id
 */
void MainWindow::OnMenuItemSetDifficultyClicked(UINT id) {
    // 如果要设置的参数与当前游戏参数相同，则直接返回
    Game::Difficulty newDiff = Game::EASY;
    if (id == IDC_MENU_ITEM_MEDIUM) {
        newDiff = Game::MEDIUM;
    } else if (id == IDC_MENU_ITEM_HARD) {
        newDiff = Game::HARD;
    }
    if (newDiff == mGame->GetDifficulty()) {
        return;
    }

    // 弹出询问对话框
    if (mGame->GetStatus() != Game::END) {
        int clickedButton = AfxMessageBox(IDS_RESET, MB_ICONQUESTION | MB_YESNO);
        if (clickedButton == IDNO) {
            return;
        }
    }

    // 设置难度
    mGame->SetDifficulty(newDiff);

    // 选中菜单项
    CDialog::GetMenu()->CheckMenuRadioItem(IDC_MENU_ITEM_EASY, IDC_MENU_ITEM_HARD, id, MF_CHECKED);
}

/**
 * "换图片"菜单项的单击响应方法。
 */
void MainWindow::OnMenuItemSetPictureClicked() {
    // 弹出询问对话框
    if (mGame->GetStatus() != Game::END) {
        int clickedButton = AfxMessageBox(IDS_RESET, MB_ICONQUESTION | MB_YESNO);
        if (clickedButton == IDNO) {
            return;
        }
    }

    // 弹出选择图片对话框
    CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_NOCHANGEDIR,
        _T("(*.bmp; *.gif; *.jpg; *.png)|*.bmp;*.gif;*.jpg;*.png||"));
    INT_PTR clickedButton = fileDlg.DoModal();
    if (clickedButton == IDCANCEL) {
        return;
    }

    // 设置图片
    CImage bitmap;
    bitmap.Load(fileDlg.GetPathName());
    mGame->SetPicture(&bitmap);
}

/**
 * "开始"菜单项的单击响应方法。
 */
void MainWindow::OnMenuItemStartClicked() {
    mGame->Start();
}

/**
 * 图片控件的单击响应方法。
 * @param id    用户单击的图片控件的 id
 */
void MainWindow::OnPictureCtrlClicked(UINT id) {
    mGame->MovePicture(id);
}
